// 导入axios模块
import axios from 'axios'
// 创建axios实例
// 导入store模块
import store from '@/store'
// 导入message消息提示函数
import { Message } from 'element-ui'
// 导入router实例
import router from '@/router'
// 多个基地址可以多个创建，然后各个加拦截器，然后按需导出 export { xxx , xxx }
const service = axios.create({
  // 配置基地址
  // 好处省略前半段写法
  // baseURL: 'http://ihrm.itheima.net/api',
  // 去自己的服务器可以不写基地址
  // 基地址(自动从环境变量下获取基地址)
  // 好处不同环境变量基地址可以不同，很灵活
  baseURL: process.env.VUE_APP_BASE_API,
  // 请求五秒无反应断开请求视为结束，也就是请求超时时间
  timeout: 5000
}
)
// 添加拦截器
// 请求拦截器
// config是记录所有请求信息(包含请求头)的对象
// Promise.reject()会得到一个失败的promise实例
// promise.resolve()成功态的
service.interceptors.request.use(config => {
  // 发出请求return到服务器之前
  const { token } = store.state.user
  if (token) {
    // 通过请求头携带给后台，给headers添加Authorization属性
    // config就是此次请求信息的大对象 methods url params data headers baseURL
    config.headers.Authorization = `Bearer ${token}`
  }
  // 必须返回请求对象给服务器
  return config
}, err => Promise.reject(err))
// 响应拦截器
service.interceptors.response.use(resp => {
  // 对服务器返回的data进行剥离
  // 解构出data
  const { data } = resp
  // 判断data的success的值
  if (data.success) {
    // true直接返回data数据
    return data
  }
  // 请求失败，返回失败态的Promise实例
  return Promise.reject(data)
}, async err => {
  // 判断token过期状态码
  if (err.response.status === 401 && err.response.data.code === 10002) {
    // 给出token过期提示
    Message.err('登录过期，请重新登陆')
    // 清空vuex中的token跟用户信息
    await store.dispatch('user/logoutAction')
    // 在js模块中router.currentRoute获取当前的路由地址
    router.replace(`/login?direactUrl=${router.currentRoute.fullPath}`)
  }
  return Promise.reject(err)
})
// 导出请求实例
export default service
